var CONFIG = require('../../../../common/config');
var CODE = require('../../../../common/code');
var async = require('async');
var superagent = require('superagent');
var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-redis');
var vcdRedisCache = cacheManager.caching({
    store: redisStore,
    host: CONFIG.VCODE_REDIS_SERVER_DOMAIN,
    port: CONFIG.VCODE_REDIS_SERVER_PORT,
    auth_pass: CONFIG.VCODE_REDIS_SERVER_PASSWORD,
    db: CONFIG.VCODE_REDIS_SERVER_DB_NUMBER,
    ttl: CONFIG.VCODE_REDIS_SERVER_TTL,
    //prefix: CONFIG.VCODE_REDIS_SERVER_PREFIX
});
var moment = require('moment');
var YjxAddressModel = require('../../../../common/yjxMysql/mapping/YjxAddressModel');
var YjxUserModel = require('../../../../common/yjxMysql/mapping/YjxUserModel');
var YjxUserExtInfoRModel = require('../../../../common/yjxMysql/mapping/YjxUserExtInfoRModel');
var YjxFeedBackModel = require('../../../../common/yjxMysql/mapping/YjxFeedBackModel');
var YjxUniUserDocModel = require('../../../../common/yjxMysql/mapping/YjxUniUserDocModel');
var YjxFavoriteModel = require('../../../../common/yjxMysql/mapping/YjxFavoriteModel');
var YjxDesignUserDocModel = require('../../../../common/yjxMysql/mapping/YjxDesignUserDocModel');
var YjxPptUserDocModel = require('../../../../common/yjxMysql/mapping/YjxPptUserDocModel');
var YjxVideoUserDocModel = require('../../../../common/yjxMysql/mapping/YjxVideoUserDocModel');
var YjxThirdPartyUserModel = require('../../../../common/yjxMysql/mapping/YjxThirdPartyUserModel');
var YjxPaymentHisModel = require('../../../../common/yjxMysql/mapping/YjxPaymentHisModel');
var YjxTradeOrderModel = require('../../../../common/yjxMysql/mapping/YjxTradeOrderModel');
var YjxFormInfoModel = require('../../../../common/yjxMysql/mapping/YjxFormInfoModel');
var YjxMemberModel = require('../../../../common/yjxMysql/mapping/YjxMemberModel');
var YjxUserPointsHisModel = require('../../../../common/yjxMysql/mapping/YjxUserPointsHisModel');
var YjxActFinanceHis = require('../../../../common/yjxMysql/mapping/YjxActFinanceHis');
var YjxActUserReward = require('../../../../common/yjxMysql/mapping/YjxActUserReward');
var YjxOrgRModel = require('../../../../common/yjxMysql/mapping/YjxOrgRModel');
var YjxAddressModel = require('../../../../common/yjxMysql/mapping/YjxAddressModel');
var YjxUserExtInfoRModel = require('../../../../common/yjxMysql/mapping/YjxUserExtInfoRModel');
var luaUtil = require('./luaUtil');
var thirdUtil = require('./thirdUtil');
var FileDownLoader = require('../../../../common/util/FileDownLoader');
var crypto = require('crypto');
var path = require('path');
var fs = require('fs');
var YjxActUserProductModel = require('../../../../common/yjxMysql/mapping/YjxActUserProductModel');
var YjxCustVideoUserDocModel = require('../../../../common/yjxMysql/mapping/YjxCustVideoUserDocModel');
var YjxActivityModel = require('../../../../common/yjxMysql/mapping/YjxActivityModel');
var YjxActRewardRuleModel = require('../../../../common/yjxMysql/mapping/YjxActRewardRuleModel');
var CommonUtil = require('../../../../common/util/CommonUtil');

var FileUpLoader = require('../../../../common/util/FileUpLoader');
// 默认用户头像
var DEFAULT_USER_PROFILE_PHOTO = "http://itbour-back.oss-cn-hangzhou.aliyuncs.com/image/U13396/2017/12/15/181805976_wapZT7TnmRu3VV3Sm1MY";
// 默认用户签名
var DEFAULT_USER_SIGNATURE = "放纵你的自由";

var userUtil = (function () {
    function userUtil() {

    }

    /**
     * 修改用户信息
     *
     * @author 严旭东
     * @date 2017-11-15
     * @param   userId: （用户唯一标识）
     * @param   nickName:  用户昵称
     * @param   avatarUrl:  用户头像
     * @param   sign:  用户签名
     * @param   callback 回调
     *              err 错误信息
     *              data 返回数据
     * 注：nickName，avatarUrl，sign必传一个
     * */
    userUtil.updateUserInfo_v1_0 = function(userId,nickName,avatarUrl,sign,callback){
        var entity =  new YjxUserModel({
            user_id: userId,
            nickname: nickName,
            profile_photo: avatarUrl,
            signature: sign
        });
        entity.updateToDB(function(err,id){
            if(err){
                return callback(err,null);
            }
            return callback(null,id);
        });
    };
    //-----------------------------------------
    /***
     * 发送验证码
     * @author 李强
     * @date 2017-11-16
     * 方式: GET
     * 参数: mobile: 手机号
     * 参数: zone:   区号
     * 返回: {}
     */
    userUtil.getMobileVerCode_v1_0 = function(zone,mobile,callback){
        var redisKey = zone + '-' + mobile;
        // 检测redis
        vcdRedisCache.get(redisKey, function (error, result) {
            // 避免mobile被连续发送验证码
            var quickly = false;
            var recd = JSON.parse(result || '{}');
            if (recd && recd.vcode_mobile && recd.vcode_create_time) {
                var cur_time = Math.floor(Date.now() / 1000);//process.uptime();
                if (cur_time - Number(recd.vcode_create_time || '0') < 60) {
                    quickly = true;
                }
            }
            if (quickly) {
                return callback("您发送验证码太过频繁",null);
            }
            // 发送验证码
            var url = 'http://' + CONFIG.SMS_SERVER_DOMAIN + ':' + CONFIG.SMS_SERVER_PORT
                + '/itbweb/itbCom/sendYjxVerCode.action?mobile=' + mobile;
            //测试用地址
            //var url = 'http://192.168.31.7:8080/itbweb/itbCom/sendYjxVerCode.action?mobile='+ mobile;
            superagent.get(url)
                .end(function (err, res2) {
                    if (err) {
                        return callback("发送失败,请再试试!",null);
                    }
                    var retJson = JSON.parse(res2.text);
                    // 缓存验证码信息
                    if (retJson) {
                        if(retJson.success == 1) {
                            var newRecd = {
                                vcode_mobile: mobile || '',
                                vcode: retJson.data.code || '',
                                vcode_create_time: Math.floor(Date.now() / 1000),//process.uptime()
                            };
                            var redisValue = JSON.stringify(newRecd);
                            vcdRedisCache.set(redisKey, redisValue, {ttl: 60 * 5});// 设置失效时间5分钟
                            return callback(null, {});
                        }else if(retJson.success == 0 && (retJson.msg == "Aliyun ClientException: Frequency limit reaches." || retJson.msg == "isv.BUSINESS_LIMIT_CONTROL")){
                            return callback("获取验证码超过最大限制，明天再来吧", {});
                        }else{
                            return callback("发送失败,请再试试!", {});
                        }
                    } else {
                        return callback("发送失败,请再试试!", {});
                    }
                });
        });
    };

    //-----------------------------------------

    /**
     * 提交建议
     *
     * @author 严旭东
     * @date 2017-11-15
     *
     * @param device: 是
     *          6字段为 一键秀 相关标记
     *          600 一键秀网页端
     *          610 一键秀 android 端
     *          620 一键秀 iOS 端
     *          630 一键秀 嵌入网页端
     *          640 一键秀微信端
     *          650 一键秀小程序端
     * @param userId: （用户唯一标识）
     * @param text:  用户建议
     * @param deviceDesc: 意见反馈用户选填的设备信息
     * @param deviceInfo: 自动搜集信息
     * @param images: 意见反馈添加截图的 url 数组的 json 字符串
     * @param mobile: 手机号
     * @param callback 回调
     *              err 错误信息
     *              data {}
     * 注:text，userId，device必传
     * */
    userUtil.sendFeedback_v1_0 = function(device,userId,text,deviceDesc,deviceInfo,images,mobile,callback){
        var entity =  new YjxFeedBackModel({
            device: device,
            user_id: userId,
            advice: text,
            device_info_user: deviceDesc,
            mobile : mobile,
            device_info_sys: deviceInfo,
            images:images
        });
        entity.saveToDB(function(err,id){
            if(err){
                return callback(err,null);
            }
            return callback(null,id);
        })
    };


    /**
     * 获取用户详细信息
     *
     * @author 李强
     * @date 2017-11-17
     *

     * @param userId: （用户唯一标识）
     * @param callback 回调
     *              err 错误信息
     *              data 返回值
     * */

    userUtil.getUserDetailInfo_v1_0 = function(userId,callback){
        var tasks = [];

        // 0. 查询用户资料
        tasks.push(function (callback) {
            var entity =  new YjxUserModel({
                user_id: userId
            });
            //查询用户信息
            entity.findFromDB(function(err,userInfo){
                if(err){
                    return callback(err,null);
                }
                if (!userInfo || userInfo.length <= 0) {
                    return callback('无此用户信息', null);
                }
                //获取用户第三方信息
                entity.getThirdPartyUserInfo(userId,function(err,results) {
                    if (err) {
                        return callback(err, null);
                    }
                    // 一键秀用户资料信息
                    var usersInfo =  {
                        "userId" : userInfo[0].user_id,
                        "evaluation":userInfo[0].evaluation.toString()||"", // 用户评价分, 默认为0
                        "nickName" : userInfo[0].nickname||"",
                        "avatarUrl" : userInfo[0].profile_photo||"",
                        "sign" : userInfo[0].signature||""
                    };
                    var data =  userUtil.combinationuserInfo(results);
                    data.userInfo = usersInfo;
                    return callback(err, data);
                });
            });
        });
        // 1. 查询 vip 信息
        tasks.push(function(callback){
            userUtil.getUserVipInfo(userId, function(error, vipInfo){
                return callback(error, vipInfo);
            });
        });
        // 2. 查询积分信息
        tasks.push(function(callback){
            userUtil.getUserPointsInfo(userId, function(error, ptsInfo){
                return callback(error, ptsInfo);
            });
        });
        // 3. 查询收益信息
        tasks.push(function (callback) {
            userUtil.getUserActivityRewardInfo__v1_7(userId, function (error, rewards) {
                return callback(error, rewards);
            });
        });
        // 4. 查询用户组织信息
        tasks.push(function (callback) {
            (new YjxOrgRModel()).getUserOrganizationsInfo(userId, function (error, orgs) {
                return callback(error, orgs || []);
            });
        });
        // 5. 查询用户身份证号信息
        tasks.push(function (callback) {
            var entity = new YjxThirdPartyUserModel({
                user_id : userId,
                account_type: 12,
                del_flg : 0
            });
            entity.findFromDB(function (error, results) {
                if(error || !results || results.length <= 0) {
                    return callback(error, null);
                }


                // 身份证号脱敏处理
                var placeholder = '******************';
                var idCardNum = results[0].field1;
                placeholder = placeholder.substr(0, idCardNum.length -8);
                var prefix = idCardNum.substr(0, 4);
                var suffix = idCardNum.substr(idCardNum.length-4, 4);
                idCardNum = prefix + placeholder + suffix;
                // 身份证号脱敏处理

                var ret = {
                    idCardNum: idCardNum,
                    realName: results[0].field2,
                    // thumbs: results[0].field3,
                    gender: results[0].field4,
                    birthDay: results[0].field5,
                    address: results[0].field6
                };
                return callback(error, ret);
            })
        });

        // 串行执行
        async.parallel(tasks, function(error, results){
            if(error) return callback(error, null);
            var data = results[0];
            data.userInfo.vip = results[1];
            data.userInfo.wallet = results[2].wallet;
            data.userInfo.reward = results[3];
            data.userInfo.organizations = results[4];
            data.userInfo.idCardNum = results[5] ? results[5].idCardNum : null;
            return callback(error, data);
        })
    };

    /**
     * 获取用户详细信息
     * @author xc
     * @date 2016-06-19
     *
     * @param userId: （用户唯一标识）
     * @param callback 回调
     *              err 错误信息
     *              data 返回值
     * */
    userUtil.getUserProfile_app_v2_0 = function(userId, callback){
        var tasks = [];

        // 0. 查询用户资料
        tasks.push(function (callback) {
            var entity =  new YjxUserModel({
                user_id: userId
            });
            //查询用户信息
            entity.findFromDB(function(err,userInfo){
                if(err){
                    return callback(err,null);
                }
                if (!userInfo || userInfo.length <= 0) {
                    return callback('无此用户信息', null);
                }
                //获取用户第三方信息
                entity.getThirdPartyUserInfo(userId,function(err,results) {
                    if (err) {
                        return callback(err, null);
                    }
                    // 一键秀用户资料信息
                    var usersInfo =  {
                        "userId" : userInfo[0].user_id,
                        "evaluation":userInfo[0].evaluation.toString()||"", // 用户评价分, 默认为0
                        "nickName" : userInfo[0].nickname||"",
                        "gender": Number(userInfo[0].gender||'0'),// 性别: 0:未知, 1:男, 2:女, 3:嘿嘿
                        "avatarUrl" : userInfo[0].profile_photo||"",
                        "sign" : userInfo[0].signature||"",
                        "birthInfo": {
                            "year": userInfo[0].birth_year||'',
                            "month": userInfo[0].birth_month||'',
                            "day": userInfo[0].birth_day||'',
                        }
                    };
                    var data =  userUtil.combinationuserInfo(results);
                    data.userInfo = usersInfo;
                    return callback(err, data);
                });
            });
        });

        // 1. 查询用户最新一条默认地址信息
        tasks.push(function (callback) {
            userUtil.getUserLastDefaultAddrInfo(userId, function (error, addrInfo) {
                return callback(error, addrInfo || {});
            });
        });
        // 2. 职业
        tasks.push(function (callback) {
            userUtil.getUserExtInfo(userId, 101, function (error, userExtInfo) {
                return callback(error, userExtInfo||[]);
            });
        });
        //3. 擅长拍摄类型
        tasks.push(function (callback) {
            userUtil.getUserExtInfo(userId, 102, function (error, userExtInfo) {
                return callback(error, userExtInfo||[]);
            });
        });

        // 串行执行
        async.parallelLimit(tasks, 6, function(error, results){
            if(error) return callback(error, null);
            var data = results[0];
            data.userInfo.defaultAddress = results[1] || {};
            data.userInfo.occupation = results[2] || [];
            data.userInfo.speciality = results[3] || [];
            return callback(error, data);
        })
    };

    /**
     * 获取用户最新一条(默认)地址
     * @author xc
     * @date 2016-06-19
     * @param userId
     * @param callback
     */
    userUtil.getUserLastDefaultAddrInfo = function(userId,callback) {
        (new YjxAddressModel()).getAddrListByUserId(userId,0,1, function (error, addrs) {
            var addrInfo = {
                "mobile": null,
                "name": null,
                "prov": null,
                "city": null,
                "dist": null,
                "detail": null,
                "type": 1,
                "default": 0,
            };
            if(addrs && addrs.length>0) {
                var retInfo = addrs[0];
                addrInfo.mobile = retInfo.mobile||retInfo.phone;
                addrInfo.name = retInfo.name||'';
                addrInfo.prov = {"id": retInfo.prov, "text": retInfo.prov_name||''};
                addrInfo.city = {"id": retInfo.city, "text": retInfo.city_name||''};
                addrInfo.dist = {"id": retInfo.dist, "text": retInfo.dist_name||''};
                addrInfo.detail = retInfo.detail||'';
                addrInfo.type = retInfo.type;
                addrInfo.default = retInfo.default;
            }
            return callback(error, addrInfo);
        });
    };

    /**
     * 获取用户扩展信息
     * @author xc
     * @date 2016-06-19
     * @param userId   用户id
     * @param infoType 扩展信息类型: 101.职业, 102.擅长拍摄类型
     * @param callback
     */
    userUtil.getUserExtInfo = function(userId, infoType, callback) {
        (new YjxUserExtInfoRModel).getUserExtInfo(userId, infoType, function(err, ret){
            var data = [];
            if(ret && ret.length>0) {
                for(var i=0; i<ret.length; i++) {
                    data.push({
                        "id": ret[i].info_id,
                        "value": ret[i].value||ret[i].num_value||null
                    });
                }
            }
            return callback(err, data);
        });
    };

    /**
     * 获取当前用户vip信息
     * @author 毛凯
     * @date 2018-3-23
     * @param userId  用户的唯一标识
     * @return
     *          results  用户vip信息
     */
    userUtil.getUserVipInfo = function(userId,callback) {
        (new YjxMemberModel()).getVipInfo(userId, function(err,res){
            if(err){
                return callback(err || '暂无获取用户vip信息',null);
            }
            var vip ={};
            res = res ? res : {};
            vip.isVip = res.isVip || 0 ;   //1是vip 0不是vip
            vip.level = res.expireDayNum <= 0 ? 0 :res.level || 0;   //vip级别
            vip.expiryTime = res.expiryTime || ""; //vip到期时间
            vip.expiryTimeStamp = res.expiryTimeStamp ||0; //vip到期时间戳
            vip.expireDayNum = res.expireDayNum || 0;//vip离到期还剩天数
            return callback(null,vip);
        });
    };

    /**
     * 获取当前用户秀米(积分)信息
     * @author 毛凯
     * @date 2018-3-23
     * @param userId  用户的唯一标识
     * @return
     *          results  用户秀米信息
     */
    userUtil.getUserPointsInfo = function(userId,callback) {
        (new YjxUserPointsHisModel()).getPointsInfo(userId,function(err,res) {
            if (err) {
                return callback(err || '无秀米信息', null);
            }
            res = res ? res : {};
            var data = {
                wallet:{
                    pointBalance : res.pointBalance || 0,
                    pointBalanceUnit : '秀米'
                }
            };
            return callback(null,data);
        });
    };

    /**
     * 组合用户信息
     *
     * @author 李强
     * @date 2017-11-17
     * @param results: （用户第三方账号信息）
     * 返回  return   {
            "userInfo" : {},
            "mobile" : {
                "zone" : "+86",
                "mobile" : 18888888888
                },
            "wechat" : {
                "token" : "ozZ04s8kqM6Gdm3AQy9pW1YK_RNo",
                "union" : "o07tHvwn0tck-ST-cDShA2UM_k4Q",
                "nickName" : "王俊",
                "avatarUrl":"http://itbour-user.oss-cn-hangzhou.aliyuncs.com/image/Unull/2017/10/31/154053345_wvk4TknmHKww7HztThwx.jpg?"},
            "QQ" : {},
            "sinaWeibo" : {}
        }
     * */
    userUtil.combinationuserInfo = function(results){
        //数据拼接
        var data = {
            "userInfo" : {},             //一键秀用户基本信息, userid必须存在
            "mobile" : {},               // 一键秀用户的手机号信息, 若未绑定, 则此字段为空
            "wechat" : {},             // 一键秀用户绑定的微信信息, 具体内容见微信登录可取得并保存的信息, 若未绑定微信, 此字段为空
            "QQ" : {},                    // 一键秀用户绑定的QQ信息, 具体内容见微信登录可取得并保存的信息, 若未绑定QQ, 此字段为空
            "sinaWeibo" : {}             // 一键秀用户绑定的sinaWeibo信息, 具体内容见微信登录可取得并保存的信息, 若未绑定sinaWeibo, 此字段为空
        };

        //用户第三方信息
        if(results && results.length>0) {
            for (var i = 0; i < results.length; i++) {
                var result = results[i];
                if (result.account_type == 10) {
                    //手机号
                    data.mobile = {
                        zone: result.field2 || "",
                        mobile: result.field1 || ""
                    }
                } else if (result.account_type == 20) {
                    //微信用户
                    data.wechat = {
                        "union": result.field1 || "",       // 微信 unionId
                        "token": result.field2 || "",       // 微信 openId
                        "nickName": result.nickname || "",
                        "avatarUrl": result.profile_photo || ""
                    }
                }
            }
        }
        return data;
    };






    /**
     * 修改作品名
     *
     * @author 严旭东
     * @date 2017-11-15
     * @param userId:  用户唯一标识
     * @param docId:  作品唯一标识
     * @param name: 修改名
     * @param callback 回调
     *              err 错误信息,当err为null是则为成功
     * */
    userUtil.renameUserDoc_v1_0 = function(userId,docId,name,callback){
        // 1. 查询作品对应的子表
        userUtil.definiteTableName(userId, docId,function(getTypeErr, resutls){
            if(getTypeErr){
                return callback(getTypeErr,null)
            }
            var tasks = [];
            for(var i=0; i<resutls.length; i++) {
                var delTask = (function(type){
                    if (type == 10) {
                        return function (callback){
                            (new YjxDesignUserDocModel()).updataDesignUserDocName(userId,docId,name,function(err,data){
                                return callback(err,data)
                            })
                        }
                    } else if(type == 20) {
                        return function (callback){
                            (new YjxPptUserDocModel()).updataPptUserDocName(userId,docId,name,function(err,data){
                                return callback(err,data)
                            })
                        }
                    }else if(type == 30){
                        return function (callback){
                            (new YjxVideoUserDocModel()).updataVideoUserDocName(userId,docId,name,function(err,data){
                                return callback(err,data)
                            })
                        }
                    }else if(type == 40){
                        return function (callback){
                            (new YjxCustVideoUserDocModel()).updateDocName(userId,docId,name,function(err,data){
                                return callback(err,data)
                            })
                        }
                    }
                })(resutls[i].tmpl_type);
                if(delTask) {
                    tasks.push(delTask);
                }
            }
            async.series(tasks, function(err, results){
                if(err){
                    return callback(err,null)
                }
                return callback(null,{})
            })
        })
    };


    /**
     * 确定作品所在子表
     *
     * @author 严旭东
     * @date 2017-11-15
     * @param userId: （用户唯一标识）
     * @param docId:  作品唯一标识
     * @param callback 回调
     *              err 错误信息
     *              results : [10]
     *          注：10代表yjx_design_user_doc
     *              20代表yjx_ppt_user_doc
     *              30代表yjx_video_user_doc
     * */
    userUtil.definiteTableName = function(userId,docId,callback){
        (new YjxUniUserDocModel().definiteTableName(userId,docId,function(err,data){
            if(err){
                return callback(err,null)
            }
            return callback(null,data)
        }))
    };





    /**
     * 删除作品
     *
     * @author 严旭东
     * @date 2017-11-15
     *
     * @param userId: （用户唯一标识）
     * @param docId:  作品唯一标识
     * @param callback 回调
     *              err 错误信息
     *              data 返回值
     * */
    userUtil.removeUserDoc_v1_0 = function(userId,docId,callback){
        var entity = new YjxUniUserDocModel({
            uni_doc_id:docId,
            update_by :userId,
            del_flg:1
        });
        entity.updateToDB(function(err,id){
            if(err){
                return callback(err,null)
            }
            return callback(null,id)
        })
    };



    /**
     * 查询作品列表
     *
     * @author 严旭东
     * @date 2017-11-18
     *
     * @param userId 用户唯一标识
     * @param pageNum 页码, 从0开始
     * @param pageSize 页容量, 大于0
     * @param withTotalPage 0/1, 1 标识获取总页数, 0或不传递标识不获取总页数, 默认为0
     * @param callback  回调
     *          err: 查询失败
     *          data : 详情见http://114.55.172.253:7000/project/11/interface/api/40
     *
     */
    //该接口3.0废弃 方法调用[2]代表只获取用户的视屏作品
    userUtil.getUserWorkList_v1_0 = function(userId,pageNum,pageSize,withTotalPage,callback){
        var entity = new YjxUniUserDocModel();
        //获取作品列表
        entity.getUserWorkList_v1_0(userId,pageNum,pageSize,withTotalPage,2,function(err,data){
            if(err){
                return callback(err,null)
            }
            if(!withTotalPage){
                return callback(null,{list:data || []})
            }
            //总页数
            entity.getUserWorkListCnt(userId,pageNum,pageSize,withTotalPage,2,function(getCntErr,count){
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                var totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, {list:data || [], totalPage : totalPage});
            })
        });

    };

    /**
     * 获取用户收藏列表
     *
     * @author 毛凯
     * @date 2017-11-17
     *
     * @param userId	    是    299188   用户唯一标识
     * @param pageNum	    是      0      页码
     * @param pageSize	    是     12      页容量, 需大于0
     * @param withTotalPage 否     1       0/1, 1, 标记需要获取总页数, 未传递或者为0, 标记不获取总页数, 默认为0
     * @param callback 回调
     *          "success" : 1,                  // 0 标识请求失败, 1 标识请求成功
     *          "msg" : "成功",                 // 如请求失败, 则为失败原因*          "data" : {
     *              list : [{
     *                      "id":1999,
     *                      "opType":1,         // 业务分类 暂定如下: 1 竖屏类型(单页/印品), 2 视频类型, 3 ppt 类型
     *                      "typeDesc":"优惠券",
     *                      "name":"创意少儿书法培训优惠券",
     *                      "thumb":"http://itbour-generate.oss-cn-hangzhou.aliyuncs.com/image/U408535/2017/11/07/143418993_uEuOZh77Qw0kIiwtXmCQ/0.jpg",
     *                      "useCounts":3697,
     *                      "w":1537,  //宽
     *                      "h":496,  //高
     *                      "author":"李国梅",
     *                      "time":"2017-11-05 13:42:41",
     *              }],
     *              totalPage : 1   // 如果需要请求, 则返回此字段
     *          }
     */
    userUtil.getUserCollectList_v1_0 = function(userId, pageNum, pageSize, withTotalPage, callback) {

        // 1. 获取列表
        var entity = new YjxFavoriteModel();
        entity.getUserFavList(userId, pageNum, pageSize,function (getListErr, list) {
            if(getListErr) {
                return callback(getListErr, null);
            }
            // 2. 不需要总页数, 直接返回
            if(!withTotalPage) {
                return callback(getListErr, {list:list});
            }
            // 3. 需要取总页数查询总页数
            entity.getUserFavListCnt(userId, function (getCntErr, count) {
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                var totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, {list:list, totalPage : totalPage});
            });
        });
    };


    /**
     * 手机号+验证码登录
     *
     * @author 毛凯
     * @date 2017-11-18
     *
     * @param mobile  18888888888  用户手机号, 验证规则同获取验证码
     * @param zone    +86 国际区号, 暂时固定传 +86
     * @param verCode 是 878789 六位验证码
     * @param callback 回调
     *           userId  如果该用户不存在则是新建用户的userId
     */
     userUtil.loginByMobileCode_v1_0 = function (zone, mobile, verCode,callback) {

         userUtil.validByVerCode(zone, mobile, verCode,function(err){
             if(err){
                 return callback(err);
             }
             //查询有无用户

             var entity =  new YjxThirdPartyUserModel({
                 field1 : mobile,
                 del_flg : 0
             });
             entity.findFromDB(function(err,userInfo) {
                 if (err) {
                     return callback(err, null);
                 }
                 if (userInfo && userInfo.length > 0) {
                     var userId = userInfo[0].user_id;
                     return callback(null, userId);
                 }
                 //没有查询到则注册
                 var timeStamp = Date.parse(new Date()) / 1000;
                 var startTimeTamp = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
                 var dateNum =timeStamp-startTimeTamp;
                 userUtil.PrefixInteger(dateNum,5,function(newNum){
                     dateNum  = newNum;
                 });
                 // var photo = "http://itbour-back.oss-cn-hangzhou.aliyuncs.com/image/U13396/2017/12/15/181805976_wapZT7TnmRu3VV3Sm1MY";
                 var photo = DEFAULT_USER_PROFILE_PHOTO;
                 var nickname = "yjx_" + dateNum;
                 // var signature = "放纵你的自由";
                 var signature = DEFAULT_USER_SIGNATURE;
                 //先插入yjx_user
                 entity =  new YjxUserModel({
                     user_type:20,     //用户类型: 0:未知, 10:内部人员, 20:普通用户
                     nickname: nickname,
                     profile_photo : photo,
                     signature : signature
                 });
                 entity.saveToDB(function(err,insertId){
                     if(err){
                         console.log("loginByMobileCode_v1_0 [saveToDB YjxUserModel] saveToDB" +err);
                         return callback(err);
                     }
                     entity = new YjxThirdPartyUserModel({
                         user_id : insertId,
                         account_type :10, //第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成
                         field1 : mobile,
                         field2 : "+86"
                     });
                     entity.saveToDB(function(err,insertThirdId){
                         if(err){
                             console.log("loginByMobileCode_v1_0 [saveToDB YjxThirdPartyUserModel] saveToDB" +err);
                             return callback(err,null);
                         }
                         return callback(null,insertId);
                     })

                 });
             });
         });
    };
    /**
     * 自动补0方法
     *
     * @author 毛凯
     * @date 2017-11-18
     *
     * @param num  需要格式化的数字
     * @param length 需要多少位的数字长度
     * @param callback 回调
     *                newNum 格式化好的数字
     * 如: num =1 ,length =5, 返回 newNum=00001
     */
    userUtil.PrefixInteger=function(num, length,callback) {
        var newNum = ( "000000000000" + num ).substr( -length );
        return callback(newNum);
    };

    /**
     * 验证验证码方法
     *
     * @author 毛凯
     * @date 2017-11-18
     *
     * @param mobile  18888888888  用户手机号, 验证规则同获取验证码
     * @param zone    +86 国际区号, 暂时固定传 +86
     * @param verCode 是 878789 六位验证码
     * @param callback 回调
     *                    err  错误信息  验证成功返回null
     */
    userUtil.validByVerCode = function (zone,mobile,verCode,callback) {
        var DEFAULT_TEST_MOBILE_FOR_CHECK="18696138681";
        var DEFAULT_TEST_MOBILE_FOR_CHECK2="18256276313";
        var DEFAULT_TEST_VCODE_FOR_CHECK="123456";
        var redisKey = zone + '-' + mobile;
        // 检查redis
        vcdRedisCache.get(redisKey, function (err, result) {
            //测试逻辑
            if (mobile == DEFAULT_TEST_MOBILE_FOR_CHECK || mobile == DEFAULT_TEST_MOBILE_FOR_CHECK2) {
                if (verCode != DEFAULT_TEST_VCODE_FOR_CHECK) {
                    return callback('验证码错误');
                }
                return callback(null);
            } else {
                //常规逻辑
                var recd = JSON.parse(result || '{}');
                // 比较时间，如果超过5分钟，则返回失败
                // 比较 vcode_create_time 和当前时间
                if (!recd.vcode) {
                    return callback('验证码错误');
                }
                var cur_time = Math.floor(Date.now() / 1000);
                if (cur_time - Number(recd.vcode_create_time || '0') >= 5 * 60) {
                    return callback('验证码已失效，请重新获取');
                }
                if (recd.vcode != verCode) {
                    return callback('验证码错误');
                }
                return callback(null);
            }
        });
    };


    /**
     * 获取用户个人中心显示数据
     *
     * @author 严旭东
     * @date 2017-11-18
     *
     * @param userId 用户唯一标识
     * @param docCnt 用户作品列表请求个数
     * @param opTypes 数组的 json 字符串, 默认为 [2]
     * @param callback  回调
     *          err: 查询失败
     *          data : 详情见http://114.55.172.253:7000/project/11/interface/api/103
     *
     */

    userUtil.getPersonalCenterInfo_v1_0 = function(userId,docCnt,opTypes,callback){
        var entity = new YjxUniUserDocModel();
        entity.getUserWorkList_v1_0Web(userId,0,docCnt,opTypes,function(err,data){
            if(err){
                return callback(err,null)
            }
            return callback(err,{docs:data})
        })
   };

    /**
     * 第三方登陆
     *
     * @author 毛凯
     * @date 2017-11-18
     *
     * @deprecated 移动端调用 bug, app 1.1 废弃
     *
     * @param nickName  是  哈哈 该平台用户昵称
     * @param avatarUrl 是       该平台用户头像
     * @param field1    是  o07tHvwn0tck-ST-cDShA2UM_k4Q 各平台的全平台唯一标识, 如微信的 unionid
     * @param platform  是  1   第三方平台标记   20 标记微信
     *                                         21 标记QQ
     *                                         30 标记小米登录
     *                                         40 标记新浪微博
     * @param field2   是 oi9hmuP_zpcmVwkznvHq4IyVtdf0 各平台的单一平台唯一标识, 如微信的 openid
     * @param field3   否 预留字段, 详见备注
     * @param field4   否 预留字段, 详见备注
     * @param field5   否 预留字段, 详见备注
     * @param callback 回调
     *            userId  如果该用户不存在则是新建用户的userId
     */
    userUtil.loginByThirdPlatform_v1_0 = function (nickName, avatarUrl, field1,platform,field2,field3,field4,field5,callback) {
        platform = Number(platform);
        var tasks = [];

        // 1. 判断是否是微信登录, 如果是微信登录, 则调用微信的登录修正方法, 检测用户是否存在
        tasks.push(function (callback) {
            var data = {};
            data.isWeChatLogin = false;                         //*** 记录是否是微信登录
            // '第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成',
            if (platform !== 20) {
                return callback(null, data);
            }
            data.isWeChatLogin = true;                          //*** 记录是否是微信登录
            var entity = new YjxThirdPartyUserModel();
            entity.checkWechatUserIsExistsForV1_0(field1,function (findErr, user) {
                if (findErr) {
                    return callback(findErr, null);
                }
                data.userId = user ? Number(user.user_id) : null;       //*** 记录查询的微信 id
                return callback(findErr, data);
            });

        });
        // 2.如果不是微信登录, 则走正常逻辑, 检测用户是否存在
        tasks.push(function (data, callback) {
            if (data.isWeChatLogin) {
                return callback(null, data);
            }
            var entity =  new YjxThirdPartyUserModel({
                account_type : platform,
                field1: field1,
                del_flg : 0
            });
            entity.findFromDB(function(error, users) {
                if(users && users.length > 0) {
                    data.userId = Number(users[0].user_id);     //*** 记录对应的用户 id
                }
                return callback(error, data);
            });
        });
        // 3. 如果用户存在, 不注册用户, 直接走下一步, 如果用户不存在,则注册一个第三方用户
        tasks.push(function (data, callback) {
            if(data.userId && data.userId >0) {
                return callback(null, data);
            }
            userUtil.registerThirdPartyUser(platform, nickName, avatarUrl, field1, field2, field3, field4, field5, function (error, userId) {
                data.userId = userId;                           //*** 记录注册的用户 id
                return callback(error, data);
            });
        });
        async.waterfall(tasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.userId);
        });
    };

    /**
     * 第三方登陆 v1_0_1
     *
     * @author 王俊
     * @date 2017-12-26
     *
     * @deprecated 使用/service/userCenterService 下的服务实现, (deprecate by 王俊 2018-07-19)
     *
     * @param device    是   6  字段为 一键秀 相关标记
     *                      600 一键秀网页端
     *                      610 一键秀 android 端
     *                      620 一键秀 iOS 端
     *                      630 一键秀 嵌入网页端
     *                      640 一键秀微信端
     *                      650 一键秀小程序端
     * @param nickName  是  哈哈 该平台用户昵称
     * @param avatarUrl 是       该平台用户头像
     * @param field1    是  o07tHvwn0tck-ST-cDShA2UM_k4Q 各平台的全平台唯一标识, 如微信的 openid
     * @param platform  是  20 '第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成',
     * @param field2   是 oi9hmuP_zpcmVwkznvHq4IyVtdf0 各平台的单一平台唯一标识, 如微信的 unionid
     * @param field3   否 预留字段, 详见备注
     * @param field4   否 预留字段, 详见备注
     * @param field5   否 预留字段, 详见备注
     * @param callback 回调
     *            userId  如果该用户不存在则是新建用户的userId
     */
    userUtil.loginByThirdPlatform_v1_0_1 = function (device,platform, nickName, avatarUrl, field1,field2,field3,field4,field5,callback) {
        platform = Number(platform);
        var tasks = [];
        //将用户头像转存到oss服务器返回新的头像链接地址
        tasks.push(function (callback) {
            var data = {};
            if(!avatarUrl){
                return callback(null,data);
            }
            var md5 = crypto.createHash('md5');
            var fileName = md5.update(avatarUrl).digest('hex');
            var dst = path.resolve(__dirname, '../../../public/images/'+fileName+'.jpg');
            data.path = dst;
            return callback(null,data);
        });
        //判断文件是否存在
        tasks.push(function (data, callback) {
            if(!data.path) return callback(null, data);
            fs.exists(data.path, function (exists) {
                data.needDownload = !exists;
                return callback(null, data);
            })
        });
        // 下载文件
        tasks.push(function (data, callback) {
            if(!data.needDownload) return callback(null, data);
            FileDownLoader.download(avatarUrl, data.path, function (error, avaPath) {
                data.avaPath = avaPath;
                return callback(error, data);
            });
        });
        // 上传到oss拿到新的链接地址
        tasks.push(function (data, callback) {
            if(!avatarUrl) return callback(null, data);
            var obj_key = CommonUtil.getUploadFileName(0,"0");
            var bucket = CONFIG.BUCKET_ITBOUR_USER;
            FileUpLoader.upload(data.avaPath,obj_key,bucket,function (err,url) {
                if (err){
                    return callback(err,null);
                }
                data.avaImgUrl = url;
                return callback(null,data);
            })
        });
        // 刪除本地圖片
        tasks.push(function (data, callback) {
            if(!data.avaPath) return callback(null, data);
            fs.unlink(data.avaPath, function(err) {
                return callback(null,data);
            });
        });
        // 1. 判断是否是微信登录, 如果是微信登录, 则调用微信的登录修正方法, 检测用户是否存在
        tasks.push(function (data,callback) {
            data.isWeChatLogin = false;                         //*** 记录是否是微信登录
            // '第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成',
            //device 为600是WEB登录和App存放数据库字段不一致直接返回走下面逻辑
            if (platform !== 20 || Number(device) === 600) {
                return callback(null, data);
            }
            data.isWeChatLogin = true;                          //*** 记录是否是微信登录
            userUtil.fixWechatUserLoginForApp_v1_0_1(platform, nickName, data.avaImgUrl, field1, field2, field3, field4, field5, function (error, userId) {
                if(userId && userId >=0) {
                    data.userId = userId;                       //*** 记录对应的用户 id
                }
                return callback(error, data);
            })
        });
        // 2.如果不是微信登录, 则走正常逻辑, 检测用户是否存在
        tasks.push(function (data, callback) {
            if (data.isWeChatLogin) {
                return callback(null, data);
            }
            var entity =  new YjxThirdPartyUserModel({
                account_type : platform,
                field1: field1,
                del_flg : 0
            });
            entity.findFromDB(function(error, users) {
                if(users && users.length > 0) {
                    data.userId = Number(users[0].user_id);     //*** 记录对应的用户 id
                }
                return callback(error, data);
            });
        });
        // 3. 如果用户存在, 不注册用户, 返回 userId, 如果用户不存在,则注册一个第三方用户
        tasks.push(function (data, callback) {
            if(data.userId && data.userId >0) {
                return callback(null, data);
            }
            userUtil.registerThirdPartyUser(platform, nickName, data.avaImgUrl, field1, field2, field3, field4, field5, function (error, userId) {
                data.userId = Number(userId);
                return callback(error, data);
            });
        });
        async.waterfall(tasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.userId);
        });
    };

    /**
     * 获取默认的用户昵称, 随机生成(同步方法)
     *
     * @author 王俊
     * @date 2017-12-26
     *
     * @return {string} s
     */
    userUtil.getDefautUserNickName = function () {
        var timeStamp = Date.parse(new Date()) / 1000;
        var startTimeTamp = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
        var dateNum =timeStamp-startTimeTamp;
        dateNum = ( "000000000000" + dateNum ).substr(-5);
        return "yjx_" + dateNum;
    };
    /**
     * 注册第三方平台用户至 一键秀
     *
     * @author 王俊
     * @date 2017-12-26
     *
     * @param nickName  是  哈哈 该平台用户昵称
     * @param avatarUrl 是       该平台用户头像
     * @param field1    是  o07tHvwn0tck-ST-cDShA2UM_k4Q 各平台的全平台唯一标识, 如微信的 unionid
     * @param platform  是  第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成
     * @param field2   是 oi9hmuP_zpcmVwkznvHq4IyVtdf0 各平台的单一平台唯一标识, 如微信的 openid
     * @param field3   否 预留字段, 详见备注
     * @param field4   否 预留字段, 详见备注
     * @param field5   否 预留字段, 详见备注
     * @param callback 回调
     *            userId  如果该用户不存在则是新建用户的userId
     */
    userUtil.registerThirdPartyUser = function (platform, nickName, avatarUrl, field1,field2,field3,field4,field5,callback) {
        platform = Number(platform);
        if (!field1 || field1.length <=0) {
            return callback('参数错误', null);
        }
        // 微信注册, 至少需要 field1 和 field2, 为兼容1.0 接口, 继续使用, 暂时放宽条件
        // if (platform === 20 && (!field1 || !field2)) {
        //     return callback('参数错误', null);
        // }
        // 暂时只支持, 微信/ qq/小米/ 登录
        if(platform !== 20 && platform !== 21 && platform !== 30) {
            return callback('暂不支持的登录平台', null);
        }

        //没有查询到则注册
        var tasks = [];
        // 插入主表
        tasks.push(function (callback) {
            var data = {};
            var entity =  new YjxUserModel({
                user_type:20,     //用户类型: 0:未知, 10:内部人员, 20:普通用户
                nickname: nickName || userUtil.getDefautUserNickName(),
                profile_photo : avatarUrl || DEFAULT_USER_PROFILE_PHOTO,
                signature : DEFAULT_USER_SIGNATURE
            });
            entity.saveToDB(function(err,userId) {
                data.userId = Number(userId);
                return callback(err, data);
            });
        });
        // 插入子表
        tasks.push(function (data, callback) {
            var entity = new YjxThirdPartyUserModel({
                user_id : data.userId,
                profile_photo : avatarUrl,
                nickname : nickName,
                account_type :platform, //第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成
                field1 : field1,
                field2 : field2,
                field3 : field3,
                field4 : field4,
                field5 : field5,
                update_by : data.userId
            });
            entity.saveToDB(function(err,tpuId){
                return callback(err, data);
            });
        });
        // 串行执行
        async.waterfall(tasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error, data.userId);
        });
    };

    /**
     * 修正 v1_0 iOS APP 微信登录问题
     *
     * @param platform  账户平台 固定为 20 , 标记微信登录
     * @param nickName  微信昵称
     * @param avatarUrl 微信头像
     * @param unionId   (field1)    微信 unionId
     * @param openId    (field2)    微信 openId
     * @param field3    预留字段, 待定
     * @param field4    预留字段, 待定
     * @param field5    预留字段, 待定
     * @param callback  回调
     *          error:  错误
     *          userId: 用户唯一标识, 如果用户已存在, 则返回 userId, 如果不存在则返回 null
     *
     * 注意: 此接口仅为修正数据设置, 仅查询/更新数据, 不新建用户
     */
    userUtil.fixWechatUserLoginForApp_v1_0_1 = function (platform, nickName, avatarUrl, unionId, openId, field3, field4, field5, callback) {
        // 1.根据 field1 (unionId) 查询用户
        //  1.1 查询到且存在 field2 直接返回 userId
        //  1.2 查询到且不存在 field2, 更新 field2 后返回userId --
        //  1.3 查询不到
        // 2.如果出现1.3 的情况, 就根据 field2(openId)查询用户
        //  2.1 查询到用户, 更新 field1, field2 后返回 userId
        //  2.2 查询不到用户, 返回 null

        platform = Number(platform);
        if(!platform || platform !== 20 || !unionId || !openId) {
            return callback('参数错误', null);
        }
        var tasks = [];
        // 1. 根据 sql 判断用户是否存在, 且是否是正确用户
        tasks.push(function (callback) {
            var data = {};
            var entity = new YjxThirdPartyUserModel();
            entity.checkWechatUserIsExistsForV1_0_1(unionId, openId, function (findErr, user) {
                if (findErr) {
                    return callback(findErr, data);
                }
                if(!user) {
                    data.userExists = false;                    //*** 没有查询到用户, 则认为用户不存在, 需要注册
                    return callback(findErr, data);
                }
                data.user = user;                               //*** 记录查询到的用户信息
                data.userId = Number(user.user_id);             //*** 记录查询到的用户 id
                data.rightUser = Number(user.rightUser);        //*** 记录用户当前的状态
                data.userExists = true;                         //*** 没有查询到用户, 则认为用户存在
                return callback(findErr, data)
            })
        });
        // 2. 尝试修正openId 和 unionId
        tasks.push(function (data, callback) {
            // 不存在, 忽略
            if(!data.userExists) {
                return callback(null, data);
            }
            // 存在, 但是数据正确, 忽略
            if(data.rightUser) {
                return callback(null, data);
            }
            // 存在, 数据不正确, 修正
            var entity = new YjxThirdPartyUserModel({
                tpu_id : data.user.tpu_id,
                field1 : unionId,
                field2 : openId
            });
            entity.updateToDB(function (error) {
                data.rightUser = error ? 0 : 1;                 //*** 更新成功, 改变数据正确标记
                return callback(error, data);
            });
        });
        async.waterfall(tasks, function (error, data) {
            if (error) {
                return callback(error, null);
            }
            return callback(error, data.userId || null);
        });
    };
    //==========================================================================
    /**
     * 绑定手机号至当前用户
     * @author xc
     * @date 2017-11-20
     *
     * device:   6字段为 一键秀 相关标记
     *           600 一键秀网页端
     *           610 一键秀 android 端
     *           620 一键秀 iOS 端
     *           630 一键秀 嵌入网页端
     *           640 一键秀微信端
     *           650 一键秀小程序端
     * zone: 国际区号, 暂时固定传递 +86
     * mobile: 用户手机号, 验证规则同发送验证码
     * verCode: 六位验证码
     * userId: 主用户, 手机号绑定至该用户
     * */
    userUtil.bindMobileByVerCode_v1_0 = function(device, zone, mobile, verCode, userId, callback){
        // Check user
        var userEnt = new YjxUserModel();
        userEnt.getUserInfoWithThirdPartyInfo(userId,function(err, arrUserInfo){
            if(err) {
                console.log("[bindMobileByVerCode_v1_0] getUserInfoWithThirdPartyInfo Err: " +err);
                return callback(err, null);
            }

            if(arrUserInfo && arrUserInfo.length>0) {
                for(var i=0;i<arrUserInfo.length;i++){
                    var userInfo = arrUserInfo[i];
                    if(userInfo && userInfo.account_type==10/*手机*/) {
                        if(Number(userInfo.field1||'0')==Number(mobile||'0')) {
                            return callback('该手机号已绑定过', null);
                        } else {
                            return callback('已绑定过其他手机号,请先解绑', null);
                        }
                    }
                }

                // Check mobile
                var tpEnt = new YjxThirdPartyUserModel();
                tpEnt.getInfoByAccountKey(10/*手机*/,mobile, function(err2, getRet) {
                    if(err2) {
                        console.log("[bindMobileByVerCode_v1_0] getInfoByAccountKey Err: " +err2);
                        return callback(null, err2);
                    }
                    if(getRet && getRet.length>0) {
                        return callback('该手机号已绑定其他用户', null);
                    }

                    // Check verCode
                    var redisKey = zone + '-' + mobile;
                    // 检查redis
                    vcdRedisCache.get(redisKey, function(err3, result) {
                        var recd = JSON.parse(result || '{}');
                        if (!recd.vcode || recd.vcode != verCode) {
                            return callback('无效验证码!');
                        }
                        var cur_time = Math.floor(Date.now() / 1000);
                        if (cur_time - Number(recd.vcode_create_time || '0') >= 5 * 60) {
                            return callback('验证码已失效，请重新获取！');
                        }

                        // bind user
                        var newEnt = new YjxThirdPartyUserModel({
                            user_id: userId,
                            //profile_photo : '',
                            //nickname : '',
                            account_type: 10, //第三方账号类型:10:手机号(需要密码)
                            field1: mobile,
                            field2: zone
                        });
                        newEnt.saveToDB(function(insErr,newId){
                            if(insErr){
                                console.log("[bindMobileByVerCode_v1_0] saveToDB Err: " +insErr);
                                return callback(insErr,null);
                            }

                            return callback(null,newId);
                        });
                    });
                });

            } else {
                return callback('未注册用户', null);
            }
        });
    };

    //==========================================================================
    /**
     * 绑定第三方账号至当前用户
     * @author xc
     * @date 2017-11-20
     *
     * device:   6字段为 一键秀 相关标记
     *           600 一键秀网页端
     *           610 一键秀 android 端
     *           620 一键秀 iOS 端
     *           630 一键秀 嵌入网页端
     *           640 一键秀微信端
     *           650 一键秀小程序端
     * userId: 用户唯一标识
     * platform: 第三方平台标记
     *           20 标记微信
     *           21 标记QQ
     *           30 标记小米登录
     *           40 标记新浪微博
     * avatarUrl: 第三方平台用户头像
     * nickName: 第三方平台用户昵称
     * fields: {field1:xxx, field2:yyy, field3:zzz, ...}
     * */
    userUtil.bindThirdPlatform_v1_0 = function(device, userId, platform, avatarUrl, nickName, fields, callback){

        if(userId && platform && fields && fields.field1) {
            // Check user
            var userEnt = new YjxUserModel();
            userEnt.getUserInfoWithThirdPartyInfo(userId,function(err, arrUserInfo){
                if(err) {
                    console.log("[bindThirdPlatform_v1_0] getUserInfoWithThirdPartyInfo Err: " +err);
                    return callback(err, null);
                }

                if(arrUserInfo && arrUserInfo.length>0) {
                    for(var i=0;i<arrUserInfo.length;i++){
                        var userInfo = arrUserInfo[i];
                        if(userInfo && userInfo.account_type==platform) {
                            return callback('已绑定过该平台帐号,请先解绑', null);
                        }
                    }

                    // Check account
                    var tpEnt = new YjxThirdPartyUserModel();
                    tpEnt.getInfoByAccountKey(platform, fields.field1, function(err2, getRet) {
                        if(err2) {
                            console.log("[bindThirdPlatform_v1_0] getInfoByAccountKey Err: " +err2);
                            return callback(null, err2);
                        }
                        if(getRet && getRet.length>0) {
                            for(var n=0;n<getRet.length;n++) {
                                if(getRet[n].user_id==userId) {
                                    return callback('该帐号已经绑定过',null);
                                } else {
                                    return callback('该帐号已经绑定其他用户',null);
                                }
                            }
                        }

                        // bind account
                        var newEnt = new YjxThirdPartyUserModel({
                            user_id: userId,
                            profile_photo : avatarUrl||'',
                            nickname : nickName||'',
                            account_type: platform, //第三方账号类型
                            field1: fields.field1,
                            field2: fields.field2||null,
                            field3: fields.field3||null,
                            field4: fields.field4||null,
                            field5: fields.field5||null
                        });
                        newEnt.saveToDB(function(insErr,newId){
                            if(insErr){
                                console.log("[bindThirdPlatform_v1_0] saveToDB Err: " +insErr);
                                return callback(insErr,null);
                            }

                            return callback(null,newId);
                        });
                    });

                } else {
                    return callback('未注册用户', null);
                }
            });
        } else {
            return callback('参数错误', null);
        }
    };


    /**
     * 获取用户已购订单列表
     *
     * @author 毛凯
     * @date 2017-11-18
     *
     * @param  userId	是 299188 用户唯一标识
     * @param  pageNum	是 0  页码
     * @param  pageSize	是 12 页容量
     * @param  states	是 "[10]" 订单状态数组的 json 字符串
     *                                          {
     *                                               YJX_ORDER_STATE_UNPAID = 10,            // 待支付
     *                                               YJX_ORDER_STATE_PAID = 11,              // 已支付
     *                                               YJX_ORDER_STATE_FAIL = 12,              // 支付失败
     *                                               YJX_ORDER_STATE_FABRICATION = 20,       // 制作中
     *                                               YJX_ORDER_STATE_DELIVERY = 30,          // 配送中
     *                                               YJX_ORDER_STATE_COMPLETE = 40,          // 完成
     *                                               YJX_ORDER_STATE_CANCEL = 50             // 取消
     *                                           };
     * @param  withTotalPage 否 1  0/1, 1 标记获取总页数, 0/不传标记不获取总页数
     * @param payType  1现金支付 2 秀米支付
     * @param callback 回调
     *              err 错误信息
     *              result 返回结果
     **/
    userUtil.getUserOrderList_v1_1 = function(userId,pageNum,pageSize,states,payType,withTotalPage,callback){

        // 1. 获取列表
        userUtil.getOrderList(userId,pageNum,pageSize,states,payType,withTotalPage,function (getListErr, list) {
            if(getListErr) {
                return callback(getListErr, null);
            }
            var retData = {
                list : list
            };
            // 2. 不需要总页数, 直接返回
            if(!withTotalPage) {
                return callback(getListErr, retData);
            }
            // 3. 需要取总页数查询总页数
            (new YjxTradeOrderModel()).getOrderCnt(userId,pageNum,pageSize,states,payType, function (getCntErr, count) {
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                retData.totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, retData);
            });
        });
    };

    /**
     * 获取用户已购订单和订单子表列表
     *
     * @author 毛凯
     * @date 2017-11-18
     *
     * @param  userId	是 299188 用户唯一标识
     * @param  pageNum	是 0  页码
     * @param  pageSize	是 12 页容量
     * @param  states	是 "[10]" 订单状态数组的 json 字符串
     *                                          {
     *                                               YJX_ORDER_STATE_UNPAID = 10,            // 待支付
     *                                               YJX_ORDER_STATE_PAID = 11,              // 已支付
     *                                               YJX_ORDER_STATE_FAIL = 12,              // 支付失败
     *                                               YJX_ORDER_STATE_FABRICATION = 20,       // 制作中
     *                                               YJX_ORDER_STATE_DELIVERY = 30,          // 配送中
     *                                               YJX_ORDER_STATE_COMPLETE = 40,          // 完成
     *                                               YJX_ORDER_STATE_CANCEL = 50             // 取消
     *                                           };
     * @param  withTotalPage 否 1  0/1, 1 标记获取总页数, 0/不传标记不获取总页数
     * @param  payType  1现金,2秀米支付
     * @param callback 回调
     *              err 错误信息
     *              result 返回结果
     **/
    userUtil.getOrderList = function(userId,pageNum,pageSize,states,payType,withTotalPage,callback) {

        //1.先去用户订单表查询子订单类型标记位和订单主键
        (new YjxTradeOrderModel()).getAllOrder(userId,pageNum,pageSize,states,payType,function(err,result) {
            if (err) {
                console.log('userUtil [getOrderDtlTypeTag ] err' + err);
                return callback(err);
            }
            var tasks = [];
            for(var i=0; i<result.length; i++ ) {
                var t = (function(order){
                    //  2[去水印订单],4[秒杀订单],8[vip订单],16[充值订单], 32[待定]
                    var tag = Number(order.odr_dtl_type_tag);
                    var orderId = order.id;
                    var detailOrderTasks = [];
                    var isWm = tag & 2;
                    if(isWm) {
                        detailOrderTasks.push(function(callback) {
                            //3.通过orderId去查询去水印的订单子表
                            (new YjxTradeOrderModel()).getUserWMOrderSubOrderList(orderId,function (getWMOrderErr, getWMOrderRes) {
                                return callback(getWMOrderErr, getWMOrderRes);
                            });
                        });
                    }
                    var isSekil = tag & 4;
                    if(isSekil) {
                        detailOrderTasks.push(function(callback){
                            //4.通过orderId去查询秒杀订单子表
                            (new YjxTradeOrderModel()).getUserSKOrderSubOrderList(orderId,function (getSKOrderErr, getSKOrderRes) {
                                return callback(getSKOrderErr, getSKOrderRes);
                            });
                        });
                    }
                    var isVip = tag & 8;
                    if(isVip) {
                        detailOrderTasks.push(function(callback){
                            //5.通过orderId去查询vip订单子表
                            (new YjxTradeOrderModel()).getUserVIPOrderSubOrderList(orderId,function (getVIPOrderErr, getVIPOrderRes) {
                                return callback(getVIPOrderErr, getVIPOrderRes)
                            });
                        })
                    }
                    var isPts = tag & 16;
                    if(isPts) {
                        detailOrderTasks.push(function(callback){
                            //5.通过orderId去查询充值订单子表
                            (new YjxTradeOrderModel()).getUserPtsOrderSubOrderList(orderId,function (getPtsOrderErr, getPtsOrderRes) {
                                return callback(getPtsOrderErr, getPtsOrderRes)
                            });
                        })
                    }
                    if (detailOrderTasks.length <=0 ) {
                        return null;
                    }
                    return function (callback) {
                        async.parallel(detailOrderTasks, function (queryDetailErr, detailOrders) {
                            if (queryDetailErr) {
                                return callback(queryDetailErr, null);
                            }
                            var detailItems = [];
                            for (var i=0; i< detailOrders.length; i++) {
                                detailItems = detailItems.concat(detailOrders[i]);
                            }
                            return callback(queryDetailErr, detailItems);
                        });
                    }
                })(result[i]);
                tasks.push(t);
            }
            async.parallelLimit(tasks, 5, function(error, tasksResults){
                if(error){
                    return  callback(error,null);
                }
                var retData = result;
                for(var i=0;i<tasksResults.length;++i){
                    var order = result[i];
                    order.detailItems = tasksResults[i];
                }
                return callback(null,retData);
            });
        });
    };

    /**
     * 获取用户作品反馈列表
     *
     * @author 毛凯
     * @date 2017-12-12
     *
     * @param  userId	是 299188 用户唯一标识
     * @param  pageNum	是 0  页码
     * @param  pageSize	是 12 页容量
     * @param  docId	是 4  uni_doc_id
     * @param  withTotalPage 否 1  0/1, 1 标记获取总页数, 0/不传标记不获取总页数
     * @param  callback 回调
     *              err 错误信息
     *              result 返回结果
     **/
    userUtil.getDocFormList_v1_0 = function(userId,docId,pageNum,pageSize,withTotalPage,callback){
        // 1. 获取列表
        (new YjxFormInfoModel()).getFormInfoList(userId,docId,pageNum,pageSize,function (getListErr, list) {
            if(getListErr) {
                return callback(getListErr, null);
            }
            var retData = {
                list : list
            };
            // 2. 不需要总页数, 直接返回
            if(!withTotalPage) {
                return callback(getListErr, retData);
            }
            // 3. 需要取总页数查询总页数
            (new YjxFormInfoModel()).getFormInfoListCount(userId,docId,pageNum,pageSize, function (getCntErr, count) {
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                retData.totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, retData);
            });
        });
    };
    /**
     * 自定义用户作品表单
     *
     * @author 王俊
     * @date 2018-01-04
     *
     * @param userId        用户唯一标识
     * @param docId         作品唯一标识
     * @param formInfoJson  用户自定义表单的数据
     * @param callback      设置回调
     *            err:       更新失败
     */
    userUtil.customUserForm_v1_1 = function (userId, docId, formInfoJson, callback) {

        var entity = new YjxUniUserDocModel({
            uni_doc_id : docId,
            form_id : 0,
            form_cust : formInfoJson,
            update_by : userId
        });
        entity.updateToDB(function (error) {
            return callback(error);
        });
    };
    /**
     * 手机号+密码 注册_WEB_1_0
     *
     * @author 毛凯
     * @date 2018-1-25
     *
     * @param device        设备唯一标识
     * @param zone          +86
     * @param mobile        12345679810
     * @param psw             密码
     * @param verCode       验证码
     * @param callback      设置回调
     *            err:       更新失败
     */
    userUtil.registerByMobileAndPswForWeb_v1_0 = function (device,zone, mobile, psw,verCode,callback) {
        //查询数据库中有无该用户注册信息
        var entity =  new YjxThirdPartyUserModel({
            field1 : mobile,
            del_flg : 0
        });
        entity.findFromDB(function(err,userInfo) {
            if (err) {
                return callback(err, null);
            }
            if (userInfo && userInfo.length > 0) {
                var userId = userInfo[0].user_id;
                return callback("该手机号已注册",null);
            }
            //验证验证码
            userUtil.validByVerCode(zone, mobile, verCode,function(err) {
                if (err) {
                    return callback(err);
                }
                //没有查询到则注册
                var timeStamp = Date.parse(new Date()) / 1000;
                var startTimeTamp = new Date(new Date().setHours(0, 0, 0, 0)) / 1000;
                var dateNum = timeStamp - startTimeTamp;
                userUtil.PrefixInteger(dateNum, 5, function (newNum) {
                    dateNum = newNum;
                });
                var photo = DEFAULT_USER_PROFILE_PHOTO;
                var nickname = "yjx_" + dateNum;
                //先插入yjx_user
                var entity2 = new YjxUserModel({
                    user_type: 20,     //用户类型: 0:未知, 10:内部人员, 20:普通用户
                    password: psw,
                    nickname: nickname,
                    profile_photo: photo,
                    signature: DEFAULT_USER_SIGNATURE
                });
                entity2.saveToDB(function (err, insertId) {
                    if (err) {
                        console.log("loginByMobileCode_v1_0 [saveToDB YjxUserModel] saveToDB" + err);
                        return callback(err);
                    }
                    entity = new YjxThirdPartyUserModel({
                        user_id: insertId,
                        account_type: 10, //第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 20:微信, 21:QQ, 30:小米, 100:一键生成
                        field1: mobile,
                        field2: "+86"
                    });
                    entity.saveToDB(function (err, insertThirdId) {
                        if (err) {
                            console.log("loginByMobileCode_v1_0 [saveToDB YjxThirdPartyUserModel] saveToDB" + err);
                            return callback(err, null);
                        }
                        userUtil.getUserDetailInfo_v1_0(insertId, function (err, data) {
                            if (err) {
                                console.log('yjx/v1/usesr.js [loginByMobileCode_v1_0 getUserDetailInfo_v1_0 ] loginByMobileCode_v1_0 getErr' + err);
                                return callback(err, null);
                            }
                            if (!data) {
                                return callback("没有查询到用户信息", null);
                            }
                            return callback(null, data);
                        })
                    })
                });
            });
        });
    };

    /**
     * 手机号+密码 登录_WEB_1_0
     *
     * @author 毛凯
     * @date 2018-1-25
     *
     * @param device        设备唯一标识
     * @param zone          +86
     * @param mobile       12345678910
     * @param psw              密码(MD5)
     * @param callback      设置回调
     *            err:       更新失败
     */
    userUtil.loginByMobileAndPswForWeb_v1_0 = function (device,zone, mobile, psw, callback) {
        //1.先查询数据库中有无该用户
        var entity =  new YjxThirdPartyUserModel({
            field1 : mobile,
            del_flg : 0
        });
        //1.查看有无该用户的手机号信息
        entity.findFromDB(function(err,userInfo) {
            if (err) {
                return callback(err, null);
            }
            if (!userInfo || userInfo.length <= 0) {
                return callback("该手机号未注册", null);
            }
            if(!userInfo[0].user_id){
                return callback("该手机号未注册", null);
            }
            var userId = userInfo[0].user_id;
            var entity2 = new YjxUserModel({
                user_id : userId,
                password : psw,
                del_flg : 0
            });
            entity2.findFromDB(function(err,userInfo2) {
                if (err) {
                    return callback(err, null);
                }
                if (!userInfo2 || userInfo2.length <= 0) {
                    return callback("手机号或密码错误", null);
                }
                if(!userInfo2[0].user_id){
                    return callback("手机号或密码错误", null);
                }
                userUtil.getUserDetailInfo_v1_0(userInfo2[0].user_id,function(err,res){
                    if(err){
                        console.log('yjx/v1/usesr.js [loginByMobileCode_v1_0 getUserDetailInfo_v1_0 ] loginByMobileCode_v1_0 getErr'+err);
                        return callback(err,null);
                    }
                    if(!res){
                        return callback("手机号或密码错误",null);
                    }
                    return callback(null,res);
                });
            });
        });
    };
    /**
     * 手机号+验证验证码+密码 重置密码_WEB_1_0
     *
     * @author 毛凯
     * @date 2018-1-25
     *
     * @param device        用户唯一标识
     * @param zone         作品唯一标识
     * @param mobile  用户自定义表单的数据
     * @param psw     密码
     * @param verCode  验证码
     * @param callback      设置回调
     *            err:       更新失败
     */
    userUtil.resetPswForWeb_v1_0 = function (device,zone, mobile, psw,verCode,callback) {
        //先查询数据库中有无该用户
        var entity = new YjxThirdPartyUserModel({
            field1: mobile,
            del_flg: 0
        });
        //查看有无该手机号注册信息
        entity.findFromDB(function (err, userInfo) {
            if (err) {
                return callback(err, null);
            }
            //没有返回错误
            if (!userInfo || userInfo.length <= 0) {
                return callback("该手机号未注册", null);
            }

            //验证验证码
            userUtil.validByVerCode(zone, mobile, verCode,function(err) {
                if (err) {
                    return callback(err);
                }
                //有进行更新密码操作
                if (userInfo && userInfo.length > 0) {
                    var userId = userInfo[0].user_id;
                    var entity2 = new YjxUserModel({
                        user_id: userId,
                        password: psw,
                        del_flg: 0
                    });
                    entity2.updateToDB(function (err, id) {
                        if (err) {
                            return callback(err, null)
                        }
                        return callback(null, {})
                    });
                }

            });
        });
    };

    /**
     * 查询作品列表
     *
     * @author 毛凯
     * @date 2018-1-26
     *
     * @param userId 用户唯一标识
     * @param pageNum 页码, 从0开始
     * @param pageSize 页容量, 大于0
     * @param withTotalPage 0/1, 1 标识获取总页数, 0或不传递标识不获取总页数, 默认为0
     * @param opTypes  [1]  opType 数组json 字符串, 1 竖屏(单页/印品等)  2 视频  3 PPT
     * @param callback  回调
     *          err: 查询失败
     *          data : 详情见http://114.55.172.253:7000/project/11/interface/api/40
     *
     */
    userUtil.getUserWorkListForWeb_v1_0 = function(userId,pageNum,pageSize,withTotalPage,opTypes,callback){
        var entity = new YjxUniUserDocModel();
        //获取作品列表
        entity.getUserWorkList_v1_0Web(userId,pageNum,pageSize,opTypes,function(err,data){
            if(err){
                return callback(err,null)
            }
            if(!withTotalPage){
                return callback(null,{list:data || []})
            }
            //总页数
            entity.getUserWorkListCntWeb(userId,pageNum,pageSize,opTypes,function(getCntErr,count){
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                var totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, {list:data || [], totalPage : totalPage, currentPage :pageNum,totalCnt:count });
            })
        });

    };

    /**
     * 获取用户视频收藏列表_APP_1_3
     *
     * @author 毛凯
     * @date 2018-3-1
     *
     * @param userId 用户唯一标识
     * @param pageNum 页码, 从0开始
     * @param pageSize 页容量, 大于0
     * @param withTotalPage 0/1, 1 标识获取总页数, 0或不传递标识不获取总页数, 默认为0
     * @param opTypes  2  opType 数组json 字符串, 1 竖屏(单页/印品等)  2 视频  3 PPT
     * @param callback  回调
     *          err: 查询失败
     *          data : 详情见http://114.55.172.253:7000/project/11/interface/api/1226
     *
     */

    userUtil.getUserCollectList_v1_3 = function(userId,opTypes,pageNum,pageSize,withTotalPage,callback){
        var entity = new YjxFavoriteModel();
        //获取用户视收藏列表
        entity.getUserVideoFavList(userId,pageNum,pageSize,opTypes,function(err,data){
            if(err){
                return callback(err,null)
            }
            if(!withTotalPage){
                return callback(null,{list:data || []})
            }
            //获取用户用户视收藏列表总页数
            entity.getUserVideoFavListCnt(userId,pageNum,pageSize,opTypes,function(getCntErr,count){
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                var totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, {list:data || [], totalPage : totalPage});
            })
        });
    };

    /**
     * 获取用户积分列表_APP_1_3
     *
     * @author 毛凯
     * @date 2018-3-23
     *
     * @param userId 用户唯一标识
     * @param pageNum 页码, 从0开始
     * @param pageSize 页容量, 大于0
     * @param types  "[1]"订单类型数组的 json 字符串, [1] 标记获取充值列表, [2] 标记获取消耗列表[1,2]
     * @param withTotalPage 0/1, 1 标识获取总页数, 0或不传递标识不获取总页数, 默认为0
     * @param callback  回调
     *          err: 查询失败
     *          data : 详情见http://114.55.172.253:7000/project/11/interface/api/2284
     *
     */
    userUtil.getUserPointsDetailList_web_v1_1 = function(userId,pageNum,pageSize,types,withTotalPage,callback){
        var entity = new YjxUserPointsHisModel();
        //获取用户秀米明细列表
        entity.getUserPointsDetailList(userId,pageNum,pageSize,types,function(error,data){
            if(error){
                return callback(err,null)
            }
            if(!withTotalPage){
                return callback(null,{list:data || []})
            }
            //获取用户用户视收藏列表总页数
            entity.getUserPointsDetailCnt(userId,pageNum,pageSize,types,function(getCntErr,count){
                if(getCntErr) {
                    return callback(getCntErr, null);
                }
                var totalPage = Math.floor((count-1)/pageSize)+1;
                return callback(getCntErr, {list:data || [], totalPage : totalPage});
            })
        });

    };

    /**
     * 用户申请提现_ APP_1_7 添加
     *
     *
     * @author jackLiu
     * @date   2018-6-8
     *
     *
     * @param device   6 字段为 一键秀 相关标记
     * @param userId   用户唯一标识
     * @param cashAmount   提现金额, 单位: 分，例如：19998
     * @param account  提现账户，例如：18888888888@taobao.com
     * @param accountPlatform  提现平台, 10 微信, 20 支付宝
     * @param callback  回调
     *          err: 错误
     *
     */
    userUtil.applyCashReward_v1_7 = function(device,userId,cashAmount,account,accountPlatform,callback){
        var totalTasks = [];
        //检测用户是否被拉黑
        totalTasks.push(function(callback){
            var entity = new YjxUserModel({
                user_id : userId,
                del_flg : 0
            });
            entity.findFromDB(function (err,userInfo) {
                if (err){
                    return callback(err,null);
                }
                if (!userInfo || userInfo.length<0) {
                    return callback("该用户不存在",null);
                }
                if (userInfo[0].evaluation <0){
                    return callback("账号异常无法提现请联系客服",null);
                }
                var data = {};
                return callback(null,data);
            });
        });
        // 检测当天提现次数次数
        totalTasks.push(function (data, callback) {
            const entity = new YjxActFinanceHis();
            entity.getUserCurrentDayCashInfo(userId, function (error, info) {
                if(error) return callback(null, error);

                if(info.currentDayCashTimes >= CONFIG.YJX_ACTIVITY_CASH_TIMES) {
                    return callback('超过当日最大提现次数, 暂不可提现');
                }
                return callback(null, data);
            });
        });

        //判断当前提现金额是否超出范围
        totalTasks.push(function(data,callback){
            // 上限判断。
            if(cashAmount> CONFIG.YJX_ACTIVITY_CASH_LIMIT_MAX){
                return callback(CODE.YJX_ACTIVITY_FAIL_CASH_LIMIT_MAX,null);
            }else if(cashAmount< CONFIG.YJX_ACTIVITY_CASH_LIMIT_MIN){
                return callback(CODE.YJX_ACTIVITY_FAIL_CASH_LIMIT_MIN,null);
            }else{
                return callback(null,data);
            }
        });
        //检测当前用户余额
        totalTasks.push(function(data,callback){
            //判断用户当前余额和当前提现的金额状态
            var entity = new YjxActUserReward();
            entity.getUserBalance(userId, function (error, results) {
                if (error || !results || results.length <= 0) {
                    return callback(error || "余额不足", null);
                }
                if (results[0].balance < cashAmount) {
                    return callback("余额不足", null);
                }
                return callback(null,data);
            });
        });
        //存入数据库
        totalTasks.push(function(data,callback){
            // 向yjx_act_user_reward中插入一条（扣款）记录,  向yjx_act_finance_his中插入一条（提现申请）记录
            var entity = new YjxActFinanceHis();
            entity.applyCashReward_v1_7(device,userId,cashAmount,account,accountPlatform, CONFIG.YJX_ACTIVITY_CASH_THRESHOLD, function(errCode){
                // errCode: 错误码：0表示成功，11表示参数错误，12表示余额为0， 13表示金额没达到提现门槛，21属于合作公司的个人用户不能直接提现，31表示处理失败
                errCode = Number(errCode);
                if(errCode===0){
                    return callback(null,data);
                }else if(errCode===11){
                    return callback(CODE.YJX_ACTIVITY_FAIL_PARAMETER_ERROR,null);
                }else if(errCode===12){
                    return callback(CODE.YJX_ACTIVITY_FAIL_REMAINDER_NOT_ENOUGH,null);
                }else if(errCode===13){
                    return callback(CODE.YJX_ACTIVITY_FAIL_REMAINDER_THRESHOLD,null);
                }else if(errCode===21) {
                    return callback(CODE.YJX_ACTIVITY_FAIL_PARTNER_COMPANY_USER,null);
                }else if(errCode===31){
                    return callback(CODE.YJX_ACTIVITY_FAIL,null);
                }else{
                    return callback(CODE.YJX_ACTIVITY_FAIL,null);
                }
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error,{});
        });
    };

    /**
     * 获取用户收益信息_ APP_1_7 添加
     *
     * @author 李强
     * @date 2018-06-08
     * @param userId   用户唯一标识
     **@param callback  回调
     *          err: 查询失败
     *          data : http://yapi.yijianxiu.com:7000/mock/11/yjx/v1/user/getUserActivityRewardInfo__v1_7
     *
     */
    userUtil.getUserActivityRewardInfo__v1_7 = function (userId, callback) {
        var totalTasks = [];
        // 1. 查询用户总收益
        totalTasks.push(function (callback) {
            var entity = new YjxActUserReward();
            var data = {};
            entity.getUserTotalReward(userId, function (error, results) {
                data.totalReward = results;
                return callback(error, data);
            });
        });

        // 2. 查询用户总余额
        totalTasks.push(function (data,callback) {
            var entity = new YjxActUserReward();
            entity.getUserBalance(userId, function (error, results) {
                data.balance = results;
                return callback(error, data);
            });
        });

        // 3. 查询用户已提现总额
        totalTasks.push(function (data,callback) {
            var entity = new YjxActFinanceHis();
            entity.getUserAlreadyCash(userId, function (error, results) {
                data.alreadyCash = results;
                return callback(error, data);
            });
        });

        // 4. 查询用户提现中总额
        totalTasks.push(function (data,callback) {
            var entity = new YjxActFinanceHis();
            entity.getUserProcessCash(userId, function (error, results) {
                data.processCash = results;
                return callback(error, data);
            });
        });
        // 5. 查询用户作为推广方奖励总额
        totalTasks.push(function (data, callback) {
            var entity = new YjxActUserReward();
            entity.getUserPromoterTotalReward(userId, function (error, promoterTotalReward) {
                data.promoterTotalReward = promoterTotalReward;
                return callback(error, data);
            });
        });

        async.waterfall(totalTasks, function (error, data) {
            var  ret = {
                "totalReward" : 0,                                         // 总计收益, 单位: 分
                "balance" : 0,                                             // 余额, 单位: 分,
                "alreadyCash" : 0,                                         // 已提现金额, 单位: 分
                "processCash" : 0,                                         // 处理提现中金额, 单位: 分
                "minDeposit" : CONFIG.YJX_ACTIVITY_CASH_LIMIT_MIN,             // 用户单笔提现的最小额度
                "maxDeposit" : CONFIG.YJX_ACTIVITY_CASH_LIMIT_MAX,             // 用户单笔提现的最大额度
                "times" : CONFIG.YJX_ACTIVITY_CASH_TIMES,                      // 用户每日提现次数上限
                "cashThreshold" : CONFIG.YJX_ACTIVITY_CASH_THRESHOLD,           // 用户提现门槛值
                "promterReward" : data.promoterTotalReward
            };

            if (error) {
                return callback(error, null);
            }

            //用户总收益
            if(data.totalReward && data.totalReward.length>0  && data.totalReward[0].totalReward){
                ret.totalReward = data.totalReward[0].totalReward;
            }

            //用户总余额
            if(data.balance && data.balance.length>0 && data.balance[0].balance){
                ret.balance = data.balance[0].balance;
            }

            //用户已提现总额
            if(data.alreadyCash && data.alreadyCash.length>0 && data.alreadyCash[0].alreadyCash){
                ret.alreadyCash = data.alreadyCash[0].alreadyCash;
            }

            //用户申请提现中总额
            if(data.processCash && data.processCash.length>0 && data.processCash[0].processCash){
                ret.processCash = data.processCash[0].processCash;
            }
            return callback(error, ret);
        });
    };

    /**
     * 获取用户最后一次提现信息
     *
     * @author 王俊
     * @date 2018-06-09
     *
     * @param options  请求参数
     * @param {Number} options.device    设备标识
     * @param {Number} options.userId    用户唯一标识
     * @param {Function} callback  回调函数
     */
    userUtil.getUserLastCashInfo_v1_7 = function (options, callback) {
        var totalTasks = [];

        // 1. 查询当天提现次数
        totalTasks.push(function (callback) {
            var entity = new YjxActFinanceHis();
            entity.getUserCurrentDayCashInfo(options.userId, function (error, cashInfo) {
                return callback(error, cashInfo || {});
            });
        });

        // 2. 查询可提现金额
        totalTasks.push(function (callback) {
            var entity = new YjxActUserReward();
            entity.getUserBalance(options.userId, function (error, balances) {
                var data = null;
                if(balances && balances.length > 0) {
                    data = balances[0].balance || 0;
                }
                return callback(error, data);
            })
        });

        // 3. 查询最后一次提现使用的账户
        totalTasks.push(function (callback) {
            var entity = new YjxActFinanceHis();
            entity.getUserLastCashAccount(options.userId,options.device, function (error, accInfo) {
                return callback(error, accInfo || {});
            });
        });

        async.parallel(totalTasks, function (error, results) {
            if(error) {
                return callback(error, null);
            }
            var retData = {
                currentDayCashTimes : results[0].currentDayCashTimes || 0,          // 当天已提现次数
                currentDayCashAmount : results[0].currentDayCashAmount || 0,     // 当天已申请提现金额
                balance : results[1] || 0,                  // 当前可申请提现金额,
                lastCashPlatform : results[2].lastCashPlatform,            // 最后一次提现平台,
                lastCashAccount : results[2].lastCashAccount,  // 最后一次提现账户
                minDeposit : CONFIG.YJX_ACTIVITY_CASH_LIMIT_MIN,             //用户单笔提现的最小额度
                maxDeposit : CONFIG.YJX_ACTIVITY_CASH_LIMIT_MAX,             //用户单笔提现的最大额度
                times : CONFIG.YJX_ACTIVITY_CASH_TIMES,                        //用户每日提现次数上限
                cashThreshold : CONFIG.YJX_ACTIVITY_CASH_THRESHOLD           // 用户提现门槛值
            };
            return callback(error, retData);
        });
	};

    /**
     * 用户收益明细_APP_1_7 添加
     *
     *
     * @author 毛凯
     * @date   2018-6-8
     *
     * @param userId   用户唯一标识
     * @param pageNum   0
     * @param pageSize  12
     * @param withTotalPage  0
     *
     * @param callback  回调
     *          err: 错误
     *
     */
    userUtil.getUserRewardList_v1_7 = function(userId,pageNum,pageSize,withTotalPage,callback) {
        var entity = new YjxActUserReward();
        entity.getUserRewardList(userId, pageNum, pageSize, function (err, result) {
            if (err) {
                return callback(err, null);
            }
            var data = {};
            data.list = result || [];
            if (!withTotalPage) {
                return callback(null, data);
            }
            entity.getUserRewardListCnt(userId, pageNum, pageSize, function (error, count) {
                if (error) {
                    return callback(error, null);
                }
                data.currentPage = pageNum;
                data.totalPage = Math.floor((count - 1) / pageSize) + 1;
                return callback(null, data);
            });
        });
    };

    /**
     * 更新用户画像
     *
     * @author 王俊
     * @date 2018-06-19
     *
     * @param {Object} options
     * @param {Number} options.device
     * @param {Number} options.userId       用户 id
     * @param {String} options.nickName     昵称
     * @param {Number} options.gender       性别
     *
     * @param {Object} options.birthInfo    生日
     * @param {Number} options.birthInfo.year       生日年份
     * @param {Number} options.birthInfo.month      生日月份
     * @param {Number} options.birthInfo.day        生日日期
     *
     * @param {Array} options.occupation    职业
     * @param {Array} options.speciality    特长
     *
     * @param {Object} options.address      地址
     * @param {Number} options.address.mobile       收货人手机号
     * @param {Object} options.address.name         收货人姓名
     * @param {Object} options.address.prov         收货地址省份
     * @param {Number} options.address.prov.id      省份 id
     * @param {String} options.address.prov.text    省份名称
     * @param {Object} options.address.city         市
     * @param {Number} options.address.city.id      市 id
     * @param {String} options.address.city.text    市 名称
     * @param {Object} options.address.dist         区/县
     * @param {Number} options.address.dist.id      区/县 id
     * @param {String} options.address.dist.text    区/县 名称
     * @param {Object} options.address.detail       详细地址
     * @param {Number} options.address.type         地址类型, 默认为1
     * @param {Number} options.address.default      默认地址
     *
     * @param {Function} callback
     */
    userUtil.updateUserProfile_app_v2_0 = function (options, callback) {

        var totalTasks = [];

        // 1. 更新用户基础信息
        totalTasks.push(function (callback) {
            var entity = new YjxUserModel({
                user_id : options.userId,
                del_flg : 0,
                nickname : options.nickName,
                gender : options.gender,
                birth_year : options.birthInfo.year,
                birth_month : options.birthInfo.month,
                birth_day : options.birthInfo.day,
                update_by : options.userId
            });
            entity.updateToDB(function (error) {
                return callback(error, null);
            })
        });
        // 2. 更新用户地址
        totalTasks.push(function (callback) {
            options.address.userId = options.userId;
            userUtil.addUserAddress(options.address, function (error, data) {
                return callback(error, data);
            });
        });
        // 3. 更新用户职业
        totalTasks.push(function (callback) {
            userUtil.updateUserOccupation(options, function (error, data) {
                return callback(error, data);
            })
        });
        // 4. 更新用户特长
        totalTasks.push(function (callback) {
            userUtil.updateUserSpeciality(options, function (error, data) {
                return callback(error, data);
            })
        });
        // 并行更新
        async.series(totalTasks, function (error, results) {
            return callback(error, {});
        });
    };

    /**
     * 添加用户地址
     *
     * @author 王俊
     * @date 2018-06-19
     *
     * @param {Object} options      地址
     * @param {Number} options.userId      用户唯一标识
     * @param {Number} options.mobile       收货人手机号
     * @param {Object} options.name         收货人姓名
     * @param {Object} options.prov         收货地址省份
     * @param {Number} options.prov.id      省份 id
     * @param {String} options.prov.text    省份名称
     * @param {Object} options.city         市
     * @param {Number} options.city.id      市 id
     * @param {String} options.city.text    市 名称
     * @param {Object} options.dist         区/县
     * @param {Number} options.dist.id      区/县 id
     * @param {String} options.dist.text    区/县 名称
     * @param {Object} options.detail       详细地址
     * @param {Number} options.type         地址类型, 默认为1
     * @param {Number} options.default      默认地址
     * @param {Function} callback 回调函数
     */
    userUtil.addUserAddress = function (options, callback) {
        // 异常保护
        if(options.type !== 1) {
           return callback('参数错误')
        }
        var totalTasks = [];
        // 1. 若设置默认地址, 则先更新原来的地址
        totalTasks.push(function (callback) {
            if(!options.default) {
                return callback(null, null);
            }
            var entity =  new YjxAddressModel();
            entity.clearDefaultAddress(options.userId, function (error) {
                return callback(error);
            });
        });
        // 2. 若没有手机号, 获取手机号
        totalTasks.push(function (callback) {
            if(options.mobile && /^1\d{10}$/.test(options.mobile)) {
                return callback(null, null);
            }

            var entity = new YjxThirdPartyUserModel({
                user_id : options.userId,
                account_type : 10,
                del_flg : 0
            });
            entity.findFromDB(function (error, users) {
                if(error || !users || users.length <=0) {
                    return callback(error || '获取手机号失败', null);
                }
                options.mobile = users[0].field1;
                return callback(null, null);
            });
        });

        // 3. 插入新地址
        totalTasks.push(function (callback) {
            var entity = new YjxAddressModel({
                'type' : options.type,      // 地址管理
                'user_id' : options.userId,
                'mobile' : options.mobile,
                'name' : options.name,
                'prov' : options.prov.id,
                'city' : options.city.id,
                'dist' : options.dist.id,
                'detail' : options.detail,
                'default' : options.default
            });
            entity.saveToDB(function (error, insertId) {
                return callback(error, insertId);
            })
        });
        async.series(totalTasks, function (error, results) {
            return callback(error, null);
        })
    };

    /**
     * 更新用户职业
     *
     * @author 王俊
     * @date 2018-06-19
     *
     * @param {Object} options   职业数组
     * @param {Object} options.userId   职业数组
     * @param {Array} options.occupation   职业数组
     * @param {Function} callback 回调函数
     */
    userUtil.updateUserOccupation = function (options, callback) {
        var totalTasks = [];

        var occupationType = 101;
        // 1. 删除所有职业
        totalTasks.push(function (callback) {
            var entity = new YjxUserExtInfoRModel();
            var opt = {
                type : occupationType,
                userId : options.userId
            };
            entity.removeUserAllExtendInfoByType(opt, function (error, data) {
                return callback(error, data);
            });
        });
        // 2. 循环插入职业
        for (var i=0; i< options.occupation.length; i++) {
            totalTasks.push((function (infoId) {

                return function (callback) {
                    var insertEntity = new YjxUserExtInfoRModel({
                        user_id : options.userId,
                        info_id : infoId,
                        type : occupationType,
                    });
                    insertEntity.saveToDB(function (error, insertId) {
                        return callback(error, insertId);
                    });
                }
            })(options.occupation[i]))
        }
        async.series(totalTasks, function (error, results) {
            return callback(error, null);
        })
    };

    /**
     * 更新用户特长
     *
     * @author 王俊
     * @date 2018-06-19
     *
     * @param {Object} options   职业数组
     * @param {Object} options.userId   职业数组
     * @param {Array} options.speciality   特长数组
     * @param {Function} callback 回调函数
     */
    userUtil.updateUserSpeciality = function (options, callback) {
        var totalTasks = [];

        var specialityType = 102;
        // 1. 删除所有职业
        totalTasks.push(function (callback) {
            var entity = new YjxUserExtInfoRModel();
            var opt = {
                type : specialityType,
                userId : options.userId
            };
            entity.removeUserAllExtendInfoByType(opt, function (error, data) {
                return callback(error, data);
            });
        });
        // 2. 循环插入职业
        for (var i=0; i< options.speciality.length; i++) {
            totalTasks.push((function (infoId) {

                return function (callback) {
                    var insertEntity = new YjxUserExtInfoRModel({
                        user_id : options.userId,
                        info_id : infoId,
                        type : specialityType,
                    });
                    insertEntity.saveToDB(function (error, insertId) {
                        return callback(error, insertId);
                    });
                }
            })(options.speciality[i]))
        }
        async.series(totalTasks, function (error, results) {
            return callback(error, null);
        })
    };



    /**
     * 检测用户是否注册
     *
     *
     * @author 毛凯
     * @date   2018-6-8
     *
     * @param mobile   用户唯一标识
     *
     * @param callback  回调
     *          err: 错误
     *
     */
    userUtil.checkUserRegister_app_2_0 = function(mobile,callback) {
        var entity = new YjxThirdPartyUserModel();
        entity.checkUserMobile(mobile,function (err,userInfo) {
            if (err){
               return callback(err,null);
            }

            var register =  userInfo?1:0;
            return callback(null,{register : register});
        });
    };

    /**
     * 验证验证码并绑定手机号_ APP_2_0 添加
     *
     * @author 毛凯
     * @date   2018-6-19
     *
     * @param userId   18  用户id
     * @param mobile   18888888888   要检测的手机号
     * @param zone     +86 区号
     * @param verCode   022222   验证码
     * @param callback  err,userInfo
     * */
    userUtil.bindMobileWithCode_app_2_0 = function(userId,mobile,zone,verCode,callback) {
        var tasks = [];
        //验证验证码
        tasks.push(function(callback){
            userUtil.validByVerCode(zone,mobile,verCode,function (err) {
                if (err){
                    return callback(err,null);
                }
                var data = {};
                return callback(null,data);
            });
        });
        //检测该手机号是否该用户
        tasks.push(function(data,callback){
            (new YjxThirdPartyUserModel()).checkUserMobile(mobile,function (err,userInfo) {
                if (err){
                    return callback(err,null);
                }
                var register = userInfo?1:0;
                data.register = register;
                return callback(null,data);
            });
        });
        //如果不存在绑定该手机号
        tasks.push(function(data,callback){
            if (data.register){
                return callback(null,data);
            }
            (new YjxThirdPartyUserModel()).bindMobileToUser(userId,mobile,function (err,result) {
                if (err){
                    return callback(err,null);
                }
                return callback(null,data);
            });
        });
        //查询用户信息
        tasks.push(function(data,callback){
            userUtil.getUserDetailInfo_v1_0(userId,function (err,userInfo) {
                data.userInfo = userInfo;
                return callback(err,data);
            });
        });
        async.waterfall(tasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error,data.userInfo);
        });
    };



    /**
     * 验证并绑定用户身份证信息_APP_2_1添加
     *
     * @author 毛凯
     * @date   2018-6-19
     *
     * @param userId       18  用户id
     * @param realName    真实姓名
     * @param idCardNum    18888888888   身份证号
     * @param idCardThumbs   身份证照片数组
     * @param callback  err
     * */
    userUtil.updateUserIdCardInfo_app_v2_1 = function(userId,realName,idCardNum,idCardThumbs,callback) {
        var tasks = [];
        var entity = new YjxThirdPartyUserModel();

        //检测该用户的使用检测身份证合法性的次数是否溢出
        tasks.push(function(callback){
            luaUtil.checkUserUseCount(userId,function (err,result) {
                if(err || result){
                    return callback( err || "提交超过当日上限！\n请24h后重试！",null);
                }
                var data = {};
                return callback(null,data);
            });
        });
        //验证身份证是否已经存在数据库
        tasks.push(function(data,callback){
            entity.checkUserIdCardNum(realName,idCardNum,function (err,count) {
                if(err){
                    return callback(err, null);
                }

                if (count && count > 0){
                    data.exists = 1 ;
                    return callback("该身份证已验证！\n如有问题请联系客服。",null);
                }
                return callback(null,data);
            });
        });

        //检测身份证合法性
        tasks.push(function(data,callback){
            if (data.exists){
                return callback(null,data);
            }
            var options = {
                idCardNum : idCardNum,
                name : realName
            };
            thirdUtil.checkIdCard(options,function (err,result) {
                if (err){
                    return callback("姓名与身份证号不一致，请重新输入！", null);
                }
                data.checkResult = result;
                return callback(null,data);
            });
        });
        //存储身用户身份证信息
        tasks.push(function(data,callback){
            if (data.exists){
                return callback(null,data);
            }
            entity.user_id = userId;
            entity.account_type = 12;  //第三方账号类型: 0:未知, 10:手机号(需要密码), 11:邮箱(需要密码), 12:身份证(暂不作为登陆账号), 20:微信, 21:QQ, 30:小米, 40:OpenApi用户, 100:一键生成
            entity.field1 = idCardNum;
            entity.field2 = realName;
            if (idCardThumbs && idCardThumbs.length > 0) {
                entity.field3 = JSON.stringify(idCardThumbs);
            }
            entity.field4 = data.checkResult.sex;
            entity.field5 = data.checkResult.birthday;
            entity.field6 = data.checkResult.area;
            entity.update_by = userId;
            entity.saveToDB(function(err,insertId){
                if (err || insertId<= 0){
                    return callback(err||"添加失败",null);
                }
                return callback(null,data);
            });
        });
        async.waterfall(tasks, function (error, data) {
            if(error) {
                return callback(error, null);
            }
            return callback(error,{});
        });
    };



    /**
     * 获取用户已填推荐码_ APP_2_1 添加
     *
     *
     * @author 毛凯
     * @date   2018-7-2
     *
     * @param userId   用户唯一标识
     * @param actId   活动的唯一标识
     *
     * @param callback  回调
     *          err: 错误
     *
     */
    userUtil.getUserFillCouponCode_app_v2_1 = function(userId,actId,callback) {
        var totalTasks = [];

        // 1. 查询活动相关信息
        totalTasks.push(function (callback) {
            var entity = new YjxActivityModel();
            entity.getSingleActivitySettingInfo(actId, function (error, settingInfo) {
                if(error) {
                    return callback(error, null);
                }
                var data = {};
                //是否显示推荐码入口
                data.enableCoupon = 1; //0不显示  1.显示
                data.actSettingInfo = settingInfo;
                return callback(error, data);
            });
        });
        // 2. 查询规则相关信息
        totalTasks.push(function (data, callback) {
            var entity = new YjxActRewardRuleModel({
                as_id : data.actSettingInfo.as_id,
                type : 20 , //推荐码奖励
                state : 10,  //10有效
                del_flg : 0
            });
            entity.findFromDB(function (error, rules) {
                if(error || !rules || rules.length <=0) {
                    console.log( 'getUserFillCouponCode_app_v2_1  未查询到发放推荐码奖励规则');
                    data.enableCoupon = 0;
                    return callback(null, data);
                }
                if(rules.length > 1) {
                    data.enableCoupon = 0;
                    console.log( 'getUserFillCouponCode_app_v2_1  查询到发放推荐码奖励规则大于1条');
                    return callback(null, data);
                }
                return callback(error, data);
            });
        });
        //3.查询填写推荐码奖励信息
        totalTasks.push(function (data, callback) {
            if (data.enableCoupon === 0){
                return callback(null,data);
            }
            var entity = new YjxActRewardRuleModel({
                as_id : data.actSettingInfo.as_id,
                type : 21 , //填写码奖励
                state : 10,  //10有效
                del_flg : 0
            });
            var couponRule = "";
            var couFlag = true;
            entity.findFromDB(function (error, rules) {
                if(error || !rules || rules.length <=0) {
                    couFlag = false;
                    data.couponRule = couponRule;
                    return callback(null, data);
                }
                if(rules.length > 1) {
                    couFlag = false;
                    data.couponRule = couponRule;
                    console.log( 'getUserFillCouponCode_app_v2_1  查询到填写推荐码奖励规则大于1条');
                    return callback(null, data);
                }
                var totalPromoterReward = 0;
                for(var i=0; i<rules.length; i++) {
                    var rule = rules[0];
                    totalPromoterReward += ((rule.max - rule.min + 1) * rule.reward_amt);
                }
                if (totalPromoterReward !== data.actSettingInfo.sub_reward_2) {
                    couFlag = false;
                    data.couponRule = couponRule;
                    console.log('getUserFillCouponCode_app_v2_1   使用推荐码奖金配置错误');
                    return  callback(null,data);
                }
                var num = rules[0].max;
                var reward = rules[0].reward_amt/100;
                couponRule ="前"+num+"名使用推荐码用户可获"+reward+"元奖励";
                data.couponRule = couponRule;
                data.couFlag = couFlag;
                data.rule = rules[0];
                return callback(error, data);
            });
        });
        // 4. 查询已发放收益
        totalTasks.push(function (data, callback) {
            if (data.enableCoupon != 1 || !data.couFlag ){
                return callback(null,data);
            }
            var entity = new YjxActUserReward({
                act_id : actId,
                r_type : 21, // 21填写推广码奖励
                bal_flg : 1,
                del_flg : 0,
            });
            entity.findCountFromDB(function (error, cnt) {
                if(error) return callback(error);
                data.alreadyDistributeCnt = cnt;
                return callback(null, data);
            });
        });
        // 5. 计算奖励是否还有名额
        totalTasks.push(function (data, callback) {
            if (data.enableCoupon != 1 || !data.couFlag ){
                return callback(null,data);
            }
            var limit = data.rule.max - data.alreadyDistributeCnt;
            if(limit <= 0){
                data.enableCoupon = 0;
                data.couponRule = "";
            }
            return callback(null,data);
        });
        // 6. 查询用户推荐码
        totalTasks.push(function (data, callback) {
            (new YjxActUserProductModel()).getUserCcodebyActIdAndUserId(userId,actId,function (err,result) {
                if (err){
                    return callback(err,null);
                }
                if ( data.enableCoupon === 0){
                    data.couponCode = "";
                    return callback(null,data);
                }
                data.couponCode = result[0] ? result[0].couponCode : "" ;
                return callback(null,data);
            });
        });
        async.waterfall(totalTasks, function (error, data) {
            if (error){
               return callback(error,null);
            }
            var result = {
                enableCoupon : data.enableCoupon,
                couponRule : data.couponRule ||"",
                couponCode : data.couponCode || ""
            };
            return callback(error, result);
        });
    };



    /**
     * 获取用户作品统计信息_ APP_3_0 添加
     *
     *
     * @author 毛凯
     * @date   2018-7-4
     *
     * @param userId   用户唯一标识
     *
     * @param callback  回调
     *          err: 错误
     *
     */
    userUtil.getUserWorksStatisticalInfo_app_v3_0 = function(userId,callback) {
        (new YjxUniUserDocModel()).getUserDocTotalCount(userId,function (err,result) {
            if (err){
                return callback(err,null);
            }
            var retDat = {
                design : result[0].design || 0,
                video : result[0].video || 0,
                customVideo :result[0].customVideo || 0
            };
            return callback(null,retDat);
        })
    };





    return userUtil;
})();

module.exports = userUtil;